const elastic = require('./elastic');
const latitudeHelper = require('./latitudeHelper');
//const loopback = require("./loopback");

class analysis {
  /**
   * 構造函數
   * @param rule 规则
   * @param id  任务
   */
  constructor(rule, task) {
    this.task = task;
    this.rule = rule;
    this.get_rule_data_list();
  }

  get_rule_data_list() {
    let self = this;
    self.task.运行中 = true;
    self.es = new elastic(global.es.source.ip, global.es.source.verison); //  初始化ES，，，
    self.rule.maxSize = self.rule.maxSize || 10;
    self.rule.list.forEach(function (rule) {  //  循环规则
      let fields = [];
      rule.fields.forEach(function (f) {  //  组成需要字段
        fields.push(f.field);
      });
      rule.query = rule.query || undefined;  //  判断查询条件
      self.es.scroll({index: rule.index, type: rule.type, fields: fields, query: rule.query, from:rule.from}, function (data, fn) {  //  ES滚动查询
        if (!self.task.运行中) return;
        if (!data || data.length == 0) return;
        self.task.当前获取数据量 += data.length; //  设置任务当前获取到的数据条数
        var index = 0;
        for (var nIndex = 0; nIndex < self.rule.maxSize; nIndex++){ //  循环每次执行多少条数据检索
          index++;
          self.analysis_one_data(data[index], rule, function next() { //  分析单条数据
            if (!self.task.运行中) return;
            index++;
            if (index < data.length) self.analysis_one_data(data[index], rule, next);
            else if(index == data.length) return fn(true);
          });
        }

      });
    });
  }

  analysis_one_data(hit, rule, callback) {
    let self = this;
    try {
      self.task.已解析数据量++;  //  当前任务已处理数据条数加一
      //  闭包分析字段，每次分析一个字段
      (function next(index) {
        if (!self.task.运行中) return;
        if (index >= rule.fields.length) return callback(); //  若分析字段完成，则分析下一条数据
        let f = rule.fields[index]; //  当前分析字段
        try{
          let key = hit.fields[f.field];  //  取得字段值
          if (Array.isArray(key)) key = key[0]; //  判断是否为数组，是数组则取第一个成员
          latitudeHelper.PutLatitude({EntityName: f.EntityName, value: key, index: hit._index, type: hit._type, id: hit._id, systeminfo: rule.systeminfo}, function () { //  添加到维度中
            next(index + 1);  //  不管添加成功还是失败，都进行下一个字段解析
          });
        }catch (e){
          next(index + 1);  //  异常时也进行下一个字段解析
        }
      })(0);
    } catch (e) {
      callback(); //  异常时分析下一条数据
    }
  }
}

module.exports = analysis;  //  公开当前方法
